package concurrency.chapter12;

import java.util.Arrays;

/**
 * enumerate(Thread[] list)方法实际上就是enumerate(Thread[] list,true)的方法。
 * 那么形参recurse设置为true或者false到底有什么区别呢？
 * 事实上，true的情况是将所有子group中的active线程都递归到Thread数组中，
 * 而false的情况则是将ThreadGroup(父线程组)中的active线程全部复制到Thread数组中。
 * 我们通常称true的情况是递归方法，而false的方法是非递归方法。
 * 因为看一下私有方法enumerate的代码实现会发现二者就差了递归调用的方法。
 *
 */
public class ThreadGroupAPI {
    public static void main(String[] args) throws InterruptedException {
        ThreadGroup tg1 = new ThreadGroup("TG1");
        Thread t1 = new Thread(tg1, "t1") {
            @Override
            public void run() {
                while (true) {
                    try {
                        //sleep不会放弃cpu执行权进入block状态
                        Thread.sleep(2_000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        //tg1.setDaemon(true);
        t1.start();
        Thread.sleep(2_000);
        System.out.println(tg1.isDestroyed());
        //tg1.destroy();
        //System.out.println(tg1.isDestroyed());

        ThreadGroup tg2 = new ThreadGroup(tg1, "TG2");
        Thread t2 = new Thread(tg2, "t2") {
            @Override
            public void run() {
                try {
                    Thread.sleep(1_000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t2.start();

        System.out.println(tg1.activeCount());//2
        System.out.println(tg1.activeGroupCount());//1
        t2.checkAccess();//是否可以改变，改变后变成后台线程
        //tg1.destroy();//不是空的或已经销毁的，会抛异常IllegalThreadStateException

        System.out.println("1---------");
        Thread[] ts1=new Thread[tg1.activeCount()];
        tg1.enumerate(ts1);
        Arrays.asList(ts1).forEach(System.out::println);
        System.out.println("2---------");

        System.out.println("3---------");
        //第二个参数recurse，默认是true
        tg1.enumerate(ts1,true);
        Arrays.asList(ts1).forEach(System.out::println);
        System.out.println("4---------");

        //中断线程组包括子线程组
        //tg1.interrupt();
    }
}
